def numTrees(n):
    # dp[i] 表示由 i 个节点组成的二叉搜索树的数量
    dp = [0] * (n + 1)
    dp[0], dp[1] = 1, 1  # 边界条件：0 个节点和 1 个节点的二叉搜索树数量都为 1

    # 遍历所有节点数
    for i in range(2, n + 1):
        # 遍历所有可能的根节点
        for j in range(1, i + 1):
            # 左子树有 j-1 个节点，右子树有 i-j 个节点
            dp[i] += dp[j - 1] * dp[i - j]

    return dp[n]